//
// Created by LiuYou on 2021/5/20.
//

#include <cstdlib>
#include <unistd.h>
#include <cstdio>
#include <sys/wait.h>


int main() {
    const int LEFT = 30000000;
    const int RIGHT = 30000200;
    const int N = 3;
    int mark{};

    for (int i = 0; i < N; ++i) {
        pid_t pid = fork();

        if (pid < 0) {
            std::perror("fork()");
            // TODO 注意: 这里其实不建议直接std::exit(1)父进程退出。
            //  因为父进程退出后, 子进程会变成孤儿进程, 然后被init进程接管。
            //  其实这里应该有一个循环, 在父进程退出时释放掉它已经创建出的子进程。
            std::exit(1);
        } else if (pid == 0) {
            // 子进程

            // TODO 注意: j += N 的设计。
            //  这里是交叉, 因为它其实是把属于它的任务抽离领走先做了。
            for (int j = LEFT + i; j <= RIGHT; j += N) {
                mark = 1;
                for (int k = 2; k < j / 2; ++k) {
                    if (j % k == 0) {
                        mark = 0;
                        break;
                    }
                }
                if (mark == 1) {
                    std::fprintf(stdout, "[%d]:%d: %d is prime number.\n", getpid(), i, j);
                }
            }
            std::exit(0);

        } else {
            // 父进程
            // 父进程在这个if-else逻辑中, 什么也不做, 然后继续去for-i循环中fork子进程。
        }

    }


    int state{};
    // 释放资源
    for (int i = 0; i < N; ++i) {
//        wait(&state);
        // 为父进程产生的子进程进行收尸处理。
        wait(nullptr);
    }


    std::exit(0);
}